# -*- codeing = utf-8 -*-
# @Time : 2021/2/25 21:07
# @Atuthor: 朱朱
# @File: 函数练习题.py
# @Software: PyCharm


# 编写一个函数，求多个数中的最大值
import random
"""
涉及到字符串函数的时候,要充分利用以下规则
1.切片
2.组装
3.编码
4.拼接
"""

def get_max(*args):
    max_num = args[0]
    for arg in args:
        if arg>max_num:
            max_num = arg
    return max_num

# 编写一个函数，实现摇骰子的功能，打印N个骰子的点数和
"""
1.参数要有n个骰子
2.每个骰子生成1-6的随机数
3.将随机数相加得到总和
"""
def get_sum(n):
    m = 0
    for i in range(n):
        x = random.randint(1,6)
        m = m + x
    return m

# 编写一个函数，提取指定字符串中所有的字母，然后拼接在一起产生一个新的字符串
"""
1.给定一个字符串
2.遍历所有字符
3.将字符随机打算
4.然后拼接,生成新的字符串
"""
def get_alphas(word):
    new_str = ''
    for w in word:
        if w.isalpha():
            new_str = new_str + w
    return new_str

# 写一个函数，默认求10的阶乘，也可以求其他数字的阶乘
"""
1.有一个参数,接收数字
2.默认的参数为10
3.阶乘:n*(n-1)
4.使用递归,函数调用自己
"""
def get_factorial(n=10):
    if n == 1:
        return 1
    return n*get_factorial(n-1)


# 写一个函数，求多个数的平均值
"""
1.接收参数,多个数据*args
2.需要知道总和
3.需要知道个数
4.相除,求平均值
"""
def get_average(*args):
    x =0
    for arg in args:
        x += arg
    return x / len(args)

# 写一个自己的capitalize函数，能够将指定字符串的首字母变成大写字母
"""
1.指定一个字符串参数
2.提取出首写字母,和余下的字符串
3.将首写字母变成大写
4.组装字符串,并打印
"""
def my_capitalize(word):
    c = word[0]
    if 'z'>=c>='a':
        new_str = word[1:]
        return c.upper()+new_str
    return word

# 写一个自己的endswith函数，判断一个字符串是否以指定的字符串结束
"""
1.给定二个个参数old_str,str1
2.提取出最后一个字符串
old_str[-len(str1):]
3.进行字符串对比
4.如果正确返回true,否则返回FALSE
"""
def my_endswith(old_str,str1):
    if old_str[-len(str1):] == str1:
        return True
    else:
        return False

# 写一个自己的isdigit函数，判断一个字符串是否是纯数字字符串
"""
1.给出一个字符串参数word
3.遍历出所有的字符
4.判断字符是否在数字之内
5.如果不在就返回false
否则返回true
"""
def my_digit(word):
    for s in word:
        if not '0'<=s<='9':
            return False
    return True

# 写一个自己的upper函数，将一个字符串中所有的小写字母变成大写字母
"""
1.给出一个字符串参数word
2.遍历字符串
3.找出所有小写字母,定义一个变量接收
4.利用a==97 A==65 差32,转换成大写
chr(ord(word)-32) 变成大写
5.返回新字符串
"""
def my_upper(word):
    new_str=''
    for s in word:
        if 'a'<=s<='z':
            upper_s = chr(ord(s)-32)
            new_str += upper_s # 将小写转换成大写,然后写入新字符串
        else:
            new_str+=s # 如果不是小写,就写入新字符串
    return new_str

# 写一个函数实现自己in操作，判断指定序列中，指定的元素是否存在
"""
1.给出二个参数,一个序列,一个元素
2.遍历出所有序列元素
3.判断二个元素是否相等
4.相等返回true
否则返回FALSE
"""
def my_in(it,ele):
    for i in it:
        if i==ele:
            return True
    else:
        return False

# 写一个自己的replace函数，将指定字符串中指定的旧字符串转换成指定的新字符串
"""
****这个比较麻烦,用到的知识很多,需要好好吸引一下****
可以使用断点很好的理解一下

1.给出三个参数接收 指定字符串all_str  旧字符串old_str  新字符串new_str
2.遍历旧字符串
3.判断是否和指定的替换字符串相等
采用临时切片方法与旧字符串做对比
如果不相等,就一个一个的写入rs中
4.完成替换 如果相等,
5.生成新字符串 rs
6.返回 rs
"""
def my_replace(all_str,old_str,new_str):
    rs = '' # 定义空字符串接收结果
    i = 0 # 定义i初始值
    while i< len(all_str): # 开始遍历指定字符串,从0开始
        temp = all_str[i:i+len(old_str)] # 定义临时变量,按照旧字符长度切片
        if temp != old_str: # 如果临时切片,和旧字符串不相等
            rs += all_str[i] # 则一个一个写入接收字符串rs中
            i+=1 # 循环计步器加1
        else:   # 如果临时切片,与旧字符串相等,则替换成新的字符串
            rs += new_str # 将新字符串全部写入接收字符串中
            i+=len(old_str) # 循环计步器要加上整个旧字符串的长度
    return rs #返回接收字符串


# 写一个自己的max函数，获取指定序列中元素的最大值。如果序列是字典，取字典值的最大值
"""
1.给出一个参数接收指定序列
2.判断序是否是字典
isinstance(seq,dict) # 查看对象seq是否通过dict类创建出来的实例
3.遍历这个字典
4.判断最大值
5.返回结果
"""
def get_max2(seq):
    if isinstance(seq,dict):
        seq = list(seq.values())
    max_x = seq[0]
    for i in seq:
        if i >max_x:
            max_x=i
    return max_x


print(get_max(1,8,9,11,88))
print(get_sum(5))
print(get_alphas('this is new world'))
print(get_factorial(10))
print(get_average(1, 2, 3, 4, 5, 6))
print(my_capitalize('myword'))
print(my_endswith('hello', 'lo'))
print(my_digit('a387987894')) # a不是数字
print(my_upper('HellO word'))
print(my_in([3,4,5,7], 7)) # 序列如果是字符串是不可以的
print(my_replace('how you and you fine you ok', 'you', 'me'))
print(get_max2([2, 4, 8, 1, 9, 0, 7, 5]))
print(get_max2({'x': 10, 'y': 29, 'z': 32, 'a': 23, 'b': 19, 'c': 98}))